package JBD.FIFO;
import java.lang.StringBuffer;


public class FiFo{
	private int[] file;
	private int in; //pointe sur la valeur d'entrée
	private int out; //pointe sur la valeur de sortie
	private int nbelement;
	
	FiFo(){
		file = new int[10];
		in=0;
		out=0;
		nbelement=0;
	}
	
	
	
	
	
//Mutateurs
	public boolean estVide(){
		return nbelement==0;
	}
	
	public boolean estPleine(){
		return nbelement==file.length;
	}
	
	
	public void entrer(int e){
		if(!this.estPleine()){		//si la file n'est pas pleine, je rentre la valeur et incrémente in de 1
			file[in]=e;
			if(in<file.length-1)	//si on arrrive à la fin du tableau, on renvoye in au début
				in++;
			else
				in=0;
			nbelement++;
		}
		else
			System.out.println("File pleine !\n");	//si la file est pleine : message d'erreur
	}
	
	public int sortir(){
		if(!this.estVide()){		//si la liste n'est pas vide, on récupère la valeur qu'il y a en sortie, on incrémente le pointeur de sortie de 1
			int i=file[out];		//et on renvoye la valeur qu'on a sorti
			if(in<file.length-1){	//si le pointeur out est à la fin du tableau, on le ramène au début
				out++;
			}
			else
				out=0;
			nbelement--;
			return i;
		}
		else{ 
			System.out.println("File vide !\n");	//si la liste est vide, message d'erreur
			return 0;
		}
	}
	
	int getNbelement(){				//on renvoye le nombre d'éléments de la file
		return nbelement;
	}
	
	public boolean equals(FiFo file2){
																	//on compare les chaines de caractères des files, si elles sont identiques on renvoye vrai, sinon faux
		
		return this.toString().equals(file2.toString());
		
																	//de in à out -> comparer la valeur des 2 file[]
																	//prendre en compte que in (la valeur d'entrée) n'est pas au même endroit
		/*if(nbelement!=file2.nbelement){
			System.out.println("nombre d'éléments différents");
			return false;
		}
		int infile1 = in;
		int infile2 = file2.in;
		
		do{
			if(file[infile1]!=file2.file[infile2]){
				System.out.println("Valeur de la file différentes");
				return false;
			}
			
			if(infile1==file.length-1)
				infile1=0;
			else
				infile1++;
			
			if(infile2==file2.file.length-1)
				infile2=0;
			else
				infile2++;
				
		}while(infile1!=this.out);
		return true;*/
	}


//Fonction qui affiche les valeurs de la file
	StringBuffer fabriqueFile(){
		StringBuffer file1 = new StringBuffer();
		int infile=out;
		
		for(int i=0; i<nbelement; i++){
			file1.append(file[infile]+" ");			
			if(infile+i==file.length-1)
				infile=0;
			else
				infile++;
				
		}
		
		return file1;
	}

	public String toString(){
		return  "Valeur de la file : " + fabriqueFile() + ", Valeur IN :" + in + ", Valeur OUT : " +out + ", Nombre d'elements " + nbelement;
	}
	
}